#ifndef CSymbolTable_h
#define CSymbolTable_h

#include <vector>
#include <map>
#include <cassert>
#include "Variable.h"

template<typename T>
class CSymbolTable
{
  std::map<T, int> m_symbols;
  typedef typename std::map<T, int>::const_iterator SI;
  std::vector<SI> m_indexes;
  
public:
  /*добавить символ в таблицу и получить индекс записи*/
  int put(const T& sym)
  {
    if(m_symbols.count(sym))
      return m_symbols[sym];
    SI it = m_symbols.insert(std::make_pair(sym, m_indexes.size())).first;
    m_indexes.push_back(it);
    return m_indexes.size()-1;
  }  
  
  const T& get(int idx)
  {
    assert(idx>0 && idx<m_indexes.size());
    return m_indexes[idx]->first;
  }
  
};

#endif
